home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
d
/
mtdials.d
< prev
next >
Wrap
Text File
|
1997-10-26
|
17KB
|
397 lines
(*----------------------------------------------------------------------*
* *
* MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
* ÿ ÿ ÿ ÿ ÿ *
*----------------------------------------------------------------------*
* Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Dieses Modul ist urheberrechtlich geschtzt. *
* *
* Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
* Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
* oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
* boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
* Einverstndnisserklrung des Autors. *
* *
* Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
* fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
* Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
* widerrufen. *
*----------------------------------------------------------------------*)
(*----------------------------------------------------------------------*
* mtDials 'magische' Dialoge... *
*----------------------------------------------------------------------*)
DEFINITION MODULE mtDials;
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET;
FROM MagicAES IMPORT PtrPARMBLK;
IMPORT SYSTEM;
(* Procedure-Type for DialDo for overloading *)
TYPE DialDoProc = PROCEDURE (SYSTEM.ADDRESS, sINTEGER): sINTEGER;
CONST MoveBox = 17; (* Neue Objekttypen, kompatibel zu *)
SpecButton = 18; (* Flydials von Julian Reschke *)
SpecText = 19;
FrameBox = 20;
Helpbutton = 21; (* DERZEIT NICHT VON MAGIC UNTERSTTZT!!! *)
CircleButton = 22;
ThreeState = 23; (* 3-Status-Button! State 3 = Selected & Checked! *)
LongEdit = 24; (* Erweiterter Objekttyp fr lange Editfelder *)
CONST UndoButton = 14; (* Flag 14 kennzeichnet einen Undobutton *)
HelpButton = 15; (* Flag 15 kennzeichnet einen Helpbutton *)
(*-----------------------------------------------------------------------*)
PROCEDURE InitDials;
(* Initialisiert die MagicDials. Wird normalerweise im Modulkrper
* aufgerufen, und braucht nicht weiter beachtet zu werden.
*)
PROCEDURE DisposeDials;
(* Gibt alle internen Datenstrukturen wieder frei. Wird bei mtAppl.ApplExit
* ausgefhrt und braucht nicht weiter beachtet zu werden.
*)
PROCEDURE NewDial (tree: SYSTEM.ADDRESS): BOOLEAN;
(* Initialisiert die internen Dialogvariablen und mu vor Gebrauch der
* Dialogfunktionen fr jeden Objektbaum einmal aufgerufen worden sein.
* Bei FALSE stehen die Mglichkeiten der MagicDials fr den Objektbaum
* nicht zur Verfgung. Der Aufruf einer Routine aus diesem Modul kann
* dann einen Systemabsturz zur Folge haben. Ein mehrfaches Aufrufen
* fr einen Objektbaum wird von der Prozedur ignoriert.
*)
PROCEDURE DisposeDial (tree: SYSTEM.ADDRESS);
(* Lscht die interne Dialogvariable *)
(*-----------------------------------------------------------------------*)
PROCEDURE ObjcExtype (tree: SYSTEM.ADDRESS; entry, extyp: sINTEGER);
(* Setzt erweiterten Typ *)
PROCEDURE GetObjcExtype (tree: SYSTEM.ADDRESS; entry: sINTEGER;
VAR extyp, typ: sINTEGER);
(* Liefert den erweiterten Typ, auch von GPROGDEF-Objekten, sofern diese
* mit mtXobjects installiert wurden
*)
PROCEDURE GetKbdState (): sBITSET;
(* Diese Prozedur liefert den Status der Sondertasten (Shift, Alternate,
* Control etc. der bei _Rckkehr_ aus DialDo gltig war. Kann dazu benutzt
* werden, um im Zusammenhang mit SetUserkey bestimmte Aktionen auszulsen.
* Idee: Dirk Steins (wer sonst?)
*)
CONST CSCREEN = 0;
CMOUSE = 1;
CPOS = 2;
PROCEDURE DialCenter (tree: SYSTEM.ADDRESS; flag, x, y: sINTEGER;
VAR rect: ARRAY OF LOC);
(* Zentriert den Dialog. Folgende nderung ist ab 3.30 wirksam: Der
* Dialog wird immer auf die im Eselsohr-Popup definierten Werte abgestimmt,
* ES SEI DENN, 'flag' = CPOS!!! CSCREEN und CMOUSE haben somit keine
* Wirkung mehr, und sind nur noch aus Kompatibilittsgrnden vorhanden.
* Default-Modus ist 'Zentrieren'.
*
* Schon lnger drin, aber nicht ausdrcklich erwhnt: Bei Modus 'Zentrieren'
* wird der virtuelle Screendriver BIGSCREEN2 von Julian Reschke (SciLab)
* untersttzt, d.H, ist ein Bildschirmtreiber ber den VirtualScreen-Cookie
* installiert, wird natrlich nicht in den virtuellen Screen zentriert,
* sondern in dem gerade Sichtbaren Teil.
*
* CPOS Es wird auf die in x, y bergebene Pos gesetzt. berbgelt
* auch ein mit dem Eselsohr-Popup eingestellte Werte.
* CSCREEN, CMOUSE werden nicht mehr beachtet, sondern die Einstellungen
* des globalen Konfigs bernommen.
*
* rect enthlt nach Aufruf die entsprechende Flche des Dialogs
*)
CONST DSTART = 0;
DGROW = 1;
DSHRINK = 2;
DFINISH = 3;
DDISABLE = 4;
DENABLE = 5;
PROCEDURE DialForm (tree: SYSTEM.ADDRESS; flag: sINTEGER;
VAR small, big: ARRAY OF LOC);
(* wie bei FormDial, nur da bei DSTART tatschlich der Hintergrund gebuffert
* wird und bei DFINISH wieder freigegeben wird. small und big kommen aus-
* schlielich bei DGROW und DSHRINK zum Einsatz.
*
* Zustzliche Flags DDISABLE und DENABLE:
* DDISABLE: Der Dialog wird im "Desktop-Grau" dargestellt, um zu verdeut-
* lichen, da seine Funktionen derzeit nicht zu erreichen sind. Sinnvoll,
* wenn man ber einen Dialog einen anderen legt - der untere wird grau (nur
* die gesetzen Pixel).
* DENABLE: Stellt nach DDISABLE den Dialog wieder her.
*)
PROCEDURE DialDraw (tree: SYSTEM.ADDRESS; entry, depth: sINTEGER;
clip: ARRAY OF LOC; clipping: BOOLEAN);
(* Zeichnet den bergebenen Dialog, handling wie ObjcDraw.
* clip ist ein optionales Clipping-Rechteck, das beachtet wird, wenn
* clipping TRUE bergeben wird.
*)
PROCEDURE DialChange (tree: SYSTEM.ADDRESS; entry, state: sINTEGER;
clip: ARRAY OF LOC; clipping, set, draw: BOOLEAN);
(* MagicDial-Version von ObjcChange:
* tree = Adresse des Objektbaums
* entry = Nummer des Objekts
* state = Status-Flag, das gendert werden soll
* clip = Clipping-Rechteck
* clipping = TRUE, wenn geclipt werden soll
* set = TRUE, wenn Status gesetzt werden soll
* draw = TRUE, wenn das Objekt neugezeichnet werden soll
*)
PROCEDURE DialDo (tree: SYSTEM.ADDRESS; edit: sINTEGER): sINTEGER;
(* form_do fr MagicDials, edit ist die Nummer des ersten EDITABLE-
* Objekts. Hat der Dialog kein EDITABLE, sollte edit aus Geschwindig-
* keitsgrnden auf -1 gesetzt werden.
*)
(*------------------------------------------------------------------------*
* Definitionen fr Userhandler *
*------------------------------------------------------------------------*)
TYPE UserHandler = PROCEDURE ( (* tree *) SYSTEM.ADDRESS,
(* mx *) sINTEGER,
(* my *) sINTEGER,
(* scan *) sINTEGER,
(* kbshift *) sBITSET,
(* event *) sBITSET,
(* edobj *) sINTEGER): sBITSET;
(* Eine Prozedur dieses Typs wird - sofern sie fr einen Dialog installiert
* wird - von DialDo bei Abarbeitung eines Dialogs aufgerufen. Die Prozedur
* wird entsprechend dem Callmode bei der Installation aufgerufen.
*
* tree = Adresse des Objektbaumes
* mx, my = Mausposition
* scan = Scancode
* kbshift = Status der Sondertasten
* event = welcher Event wars (Mausklick, Tastatur, keins von beidem)
* edobj = aktuelles Edit-Objekt
*
* Als Returnwert ist ein BITSET vorgesehen. Derzeit gibt es aber noch keine
* Flags, die von DialDo ausgewertet werden. Ist das BITSET leer, macht
* DialDo weiter wie gewohnt, ist es nicht leer, bricht DialDo mit -1 ab.
*)
CONST CallByEvent = 0;
(* UserHandler sofort nach einem Event rufen *)
CallByHandling = 1;
(* UserHandler nach der Objektbehandlung durch DialDo aufrufen *)
CallByTimer = 2;
(* DialDo verwendet normalerweise keinen Timer-Event bei seiner
* Eventabfrage. Ist jedoch ein UserHandler mit CallByTimer
* installiert, wird ein MultiEvent mit Timer bei 10 Millisekunden
* ausgefhrt. Es wird wie bei CallByEvent verfahren, also der User-
* Handler vor dem Behandeln des Objekts durch DialDo aufgerufen.
*)
CallByRect = 3;
(* Hiermit wird ein Userhandler als MouseRect-Event installiert.
* Es wird wie bei CallByEvent verfahren, also der UserHandler vor
* dem Behandeln des Objekts durch DialDo aufgerufen.
*)
CallByMessage = 4;
(* Hier werden auf Message-Ereignisse reagiert.
* Es wird wie bei CallByEvent verfahren, also der UserHandler vor
* dem Behandeln des Objekts durch DialDo aufgerufen.
*)
PROCEDURE InstallHandler (tree: SYSTEM.ADDRESS; proc: UserHandler;
callmode, timer, rmode: sINTEGER;
rect: ARRAY OF LOC; mesag: SYSTEM.ADDRESS);
(* Installiert eine Prozedur vom Typ UserHandler. 'callmode' bestimmt, in
* welcher Weise die Prozedur aufgerufen wird (CallByEvent, CallByHandling,
* CallByTimer bzw. CallByRect).
*
* tree = Adresse des Objektbaums
* proc = Die UserHandler-Prozedur
* callmode = Die Art der Behandlung
* timer = Wert fr Timer-Event
* rmode = Rechteck-Event-Modus (0 = Betreten; 1 = Verlassen)
* rect = Rechteckt fr den Event
*)
PROCEDURE RemoveHandler (tree: SYSTEM.ADDRESS);
(* Deinstalliert die Handleprozedur. *)
CONST UseSolid = 0;
UseEdit = 1;
UseALT = 2;
UseGrowbox = 3;
UseCenter = 4;
UseMouse = 5;
UsePos = 6;
Res7 = 7;
Res8 = 8;
Res9 = 9;
Res10 = 10;
Res11 = 11;
Res12 = 12;
Res13 = 13;
Res14 = 14;
UseConfig = 15;
PROCEDURE DialConfig (flag: sINTEGER; set: BOOLEAN);
(* Setzt die Konfiguration der MagicDials.
*
* UseSolid = TRUE = Solides Verschieben (Default), sonst mit Rahmen
* UseEdit = TRUE = Integriertes ObjcEdit (Default), sonst AES benutzten
* UseALT = TRUE = ALTERNATE lst Button aus (Default), sonst CONTROL
* UseGrowbox = TRUE = Grow/ und Shrink-Boxen benutzen (Default)
*
* Die folgenden Flags definieren, wohin die Dialogbox am Bildschirm
* gezeichnet wird, egal was in DialCenter angegeben wurde. Alle Flags
* sind nicht Default, damit eine grundstzliche Belegung ber DialCenter
* gegeben ist.
*
* UseCenter = TRUE = Dialogbox wird auf dem Schirm zentriert
* UseMouse = TRUE = Dialogbox wird um die Mausposition zentriert
* UsePos = TRUE = Dialogbox wird an letzter Position gezeichnet
*
* Res7..Res14 = Reserviert fr zuknftige Anwendungen
*
* UseConfig = TRUE = Konfig-Popup zulassen (Default)
*)
PROCEDURE GetDialConfig (): sBITSET;
(* Liefert das augenblickliche Konfigurations-Set *)
PROCEDURE SetUserkey (tree: SYSTEM.ADDRESS; object, scan: sINTEGER;
kbstate: sBITSET; action, set: BOOLEAN);
(* Setzt die vom Benutzer konfigurierbaren Tasten. Sinn und Zweck der bung
* ist, da der Dialog bei bestimmten Tastendrcken ohne direkte Wirkung auf
* den Dialog verlassen wird. Die Liste der Tasten wird fr jeden Dialog
* extra aufgebaut. Einmal aufgebaut, bleibt sie bis DisposeDial bestehen.
*
* tree = Adresse des Objektbaumes
*
* object = Die Nummer des Objekts, welches beim korrespondierenden
* Tastendruck von DialDo returniert wird. ACHTUNG! Es wird
* nicht kontrolliert, ob das Objekt auch existiert!
*
* scan = Scancode der Taste die den Rcksprung aus DialDo veran-
* lassen soll.
*
* kbstate = Status der Sondertasten, der zustzlich zum Scancode
* vorhanden sein mu.
*
* action = Bei TRUE wird eine Bildschirmaktion ausgefhrt, so als
* ob das Objekt angeklickt wurde.
*
* set = Bei TRUE wird der Tastencode in die Liste eingetragen,
* ansonsten gelscht.
*)
PROCEDURE ResetUserkeys (tree: SYSTEM.ADDRESS);
(* Lscht smtliche Userkey-Eintrge fr einen Objektbaum *)
(* Fr die UserObjects werden einige objektunabhngige Routinen exportiert.
* Der geneigte Benutzer sollte eine genaue Vorstellung von dem haben,
* was er tun will; insbesondere sollte er den Sourcecode von mtDials
* aufmerksam studieren...
*)
PROCEDURE Rect (x, y, w, h, color: sINTEGER);
(* Zeichnet eine Rechteckflche in Farbe color *)
PROCEDURE String (x, y, width: sINTEGER; VAR string: ARRAY OF CHAR;
flags: sBITSET; center: BOOLEAN): sINTEGER;
(* Zeichnet einen String, scannt dabei auch nach den '['-Shortcuts
* Dadurch werden nur Shortcuts erkannt, die auch wirklich gezeichnet
* wurden! Returniert einen eventuellen ShortCut als _Scancode_.
* Dieser mu dann nur noch mittels SetUserkey eingetragen werden.
*
* x = X-Position in absoluten Koordinaten
* y = Y-Position in absoluten Koordinaten
* width = Wirkt im Zusammenhang mit center: Auf diese Breite wird
* der String zentriert
* string = Der zu schreibende String
* flags = Entspricht den Flags, die auch bei Buttons verwendet werden
In der Regel kann man hier den obState bergeben.
* center = String wird zentriert, wenn center = TRUE. Siehe width
*)
PROCEDURE Frame (x, y, w, h, thick: sINTEGER);
(* Zeichnet einen Rahmen, thick bestimmt die Dicke *)
PROCEDURE Shadow (x, y, w, h, thick: sINTEGER);
(* Zeichnet einen Schatten , thick bestimmt die Dicke *)
PROCEDURE Line (x, y, w, h: sINTEGER);
(* Zeichnet eine Linie *)
PROCEDURE DrawButton (p: PtrPARMBLK): sBITSET;
(* Zeichnet einen Knopf, eine Crossbox oder einen Button *)
PROCEDURE DialCharTable (VAR ch: CHAR): BOOLEAN;
(* Ruft einen Standarddialog mit einer Zeichenauswahl auf.
* TRUE: Zeichen wurde ausgewhlt, steht dann in ch
*)
(* Erweiterungen fr Fensterdialoge *)
PROCEDURE HandleEvent (event : sBITSET;
VAR x, y: sINTEGER;
VAR button: sBITSET;
VAR taste: sINTEGER;
VAR kbshift: sBITSET;
VAR scan: sINTEGER;
VAR ascii: CHAR;
VAR clicks: sINTEGER;
tree: SYSTEM.ADDRESS;
editable : BOOLEAN;
VAR edit : sINTEGER;
VAR pos : sINTEGER;
VAR entry : sINTEGER
): BOOLEAN;
(* Behandelt den Event fr einen Baum
* Wird fr WinDials bentigt
*)
PROCEDURE PrepDial ( t : SYSTEM.ADDRESS;
start : sINTEGER;
VAR editable : BOOLEAN;
VAR pos, edit : sINTEGER);
(* Bereitet den Dialog vor, setzt die Userkeys und gibt die
* Editwerte zurck. Wird fr WinDials bentigt
*)
PROCEDURE ObjcEdit (tree: SYSTEM.ADDRESS; object: sINTEGER; VAR pos: sINTEGER;
char, kind: sINTEGER);
(* Das ObjcEdit der MagicDials. Wird fr WinDials bentigt
*)
PROCEDURE DisableMenu(menu: SYSTEM.ADDRESS; disable : BOOLEAN);
(* Disablet ein Menu bei einem modalen Fensterdialog
* Wird fr WinDials bentigt
*)
PROCEDURE OverloadDialDo (newDialDo: DialDoProc): DialDoProc;
PROCEDURE IsOverloadedDialDo (): BOOLEAN;
END mtDials.